const {secret} = require("synctool")
const request = require("base")

// 高德信息
const gaode = {
	// 这是web端
	// key: 'a3cf645a99cdb989f19ca529839975ea',
	// secret: 'e919fbec882fd1c30343569c7515e375'
	// 这是web服务端
	key: 'd927f1e573e9961cc90eac240570b2d3',
	// 获取签名
	getSig(string) {
		// 与web服务端的key相对应
		const key = '9d1cd0bfe7bc93183a4df1e62c199c10'
		return secret.md5(`${string}${key}`)
	}
}

/**
 * 地图相关的api
 */
module.exports = {
	_before: function () {
		request.handleBefore(this)
	},
	
	_after(error, result) {
		return request.handleAfter(this, error, result)
	},
	
	/**
	 * 逆地理编码。只负责逆地理编码，不负责写入用户的a-user-location数据库
	 * 通过经纬度获取街道信息
	 * @param {Object} params
	 * longitude：经度
	 * latitude：纬度
	 */
	regeocoder(params) {
		const {httpInfo} = request.common
		if (httpInfo) {
			params = httpInfo.query.params
		}
		const {longitude, latitude} = params
		if (longitude && latitude && parseFloat(longitude) >= -180 && parseFloat(longitude) <= 180 && parseFloat(latitude) >= -90 && parseFloat(latitude) <= 90) {
			// 可用的api
			const urlArr = [ // https://blog.csdn.net/mingketao/article/details/129766214
				// 高德地图API (amap.com)
				`http://restapi.amap.com/v3/geocode/regeo?Key=${gaode.key}&location=${longitude},${latitude}&sig=${gaode.getSig(`Key=${gaode.key}&location=${longitude},${latitude}`)}`,
				// 百度地图API SDK (baidu.com)
				`http://api.map.baidu.com/geocoder?&location=${longitude},${latitude}&output=json`,
				// 可腾网络科技API。GET
				`https://api.kertennet.com/geography/locationInfo?lat=${latitude}&lng=${longitude}`
			]
			return new Promise((resolve, reject) => {
				// 使用第几个api
				var index = 0
				request.fetchUrl(urlArr[index]).then(res => {
					// 高德的解析
					if (index === 0) {
						// https://lbs.amap.com/api/webservice/guide/api/georegeo
						const {data = {
							info: 'OK', 
							infocode: '10000', 
							regeocode: {
								addressComponent: {
									country: '中国',
									province: '广东省',
									city: '东莞市',
									citycode: '0769',
									district: [], // 行政区。例如：海淀区
									adcode: '441900', // 行政区编码。有县区的就是县区，没有县区的就是城市
									township: '南城街道', // 坐标点所在乡镇/街道（此街道为社区街道，不是道路信息）
									towncode: '441900004000', // 乡镇街道编码
									neighborhood: { // 社区
										name: [], // 社区名称。例如：北京大学
										type: [], // POI 类型。例如：科教文化服务;学校;高等院校
									},
									building: {
										name: "东莞市统计局",
										type: "政府机构及社会团体;政府机关;地市级政府及事业单位"
									},
									businessAreas: [ // 经纬度所属商圈列表
										{
											id: "441900", // 商圈所在区域的 adcode
											location: "113.740715,22.999151", // 商圈中心点经纬度
											name: "南城", // 商圈名称
											businessArea: {}, // 商圈信息
										}
									],
									streetNumber: { // 门牌信息列表
										number: "99号",
										location: "113.751822,23.020434",
										direction: "南", // 坐标点所处街道方位
										distance: "26.4583", // 门牌地址到请求坐标的距离。单位：米
										street: "鸿福路"
									},
									seaArea: '', // 所属海域信息。例如：渤海
								},
								formatted_address: '广东省东莞市南城街道东莞市统计局东莞市人民政府'
							}
						}, status} = res
						if (status === 200) {
							var {addressComponent: {adcode, province, city, district, township, towncode}, formatted_address} = data.regeocode
							var county_code, county = Array.isArray(district) ? (district.length > 0 ? district[0] : '') : district
							// 通过该编码查询省市县三级数据再返回
							params = {
								getTreePath: {startWith: `code=="${adcode}"`},
								getTree: !district || district.length === 0 ? {startWith: `code=="${adcode}"`} : undefined
							}
							// 乡镇数据进行判断写入
							const db = uniCloud.databaseForJQL(this.getClientInfo()).collection('opendb-city-china')
							const result = {
								data: { // 暂时只要以下数据
									province,
									province_code: '',
									city,
									city_code: '',
									county,
									county_code,
									town: township,
									town_code: towncode,
									formatted_address,
									longitude, latitude
								}
							}
							const success = () => {
								resolve(request.getResult(result))
							}
							db.get(params).then(res => {
								const {data} = res
								if (data.length > 0) {
									// 省级
									result.data.province = data[0].name
									result.data.province_code = data[0].code
									// 市级
									result.data.city = data[0].children[0].name
									result.data.city_code = data[0].children[0].code
									if (!district || district.length === 0) {
										// 没有县级单位的，用镇来代替
										for (let i = 0; i < data[0].children[0].children.length; i++) {
											if (data[0].children[0].children[i].name === township) {
												result.data.town = result.data.county = data[0].children[0].children[i].name
												result.data.town_code = result.data.county_code = data[0].children[0].children[i].code
												break
											}
										}
										success()
									} else {
										// 有县级单位的
										result.data.county = data[0].children[0].children[0].name
										result.data.county_code = data[0].children[0].children[0].code
										// 要对乡镇数据进行判断写入
										db.where({code: towncode}).get().then(res => {
											if (res.data.length === 0) {
												// 新增该乡镇
												db.add({
													type: 3,
													name: township,
													code: towncode,
													parent_code: adcode,
												}).then(success).catch(success)
											} else {
												success()
											}
										})
									}
								} else {
									success()
								}
							}).catch(err => {
								success()
							})
						} else {
							reject(res)
						}
					}
				}).catch(reject)
			})
		}
		return {
			errCode: 'PARAMS_IS_ERROR',
			errMsg: '请传入有效的经纬度'
		}
	}
}
